#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/interrupt.h>

// myirq{
//      compatilbe = "hqyj,irq";
//      interrupt-parent = <&gpiof>;
//      interrupts = <9 0>, <7 0>,<8 0>;
// };

struct device_node* node;//获取设备树节点
unsigned int irqno;//解析函数返回值
int ret;//注册中断
irqreturn_t key_irq(int irq, void* dev)//中断处理函数
{
    printk("按键1按下！\n");
    return IRQ_HANDLED;
}
static int __init mycdev_init(void)
{
    //1.获取设备树节点
    node = of_find_compatible_node(NULL, NULL, "hqyj,irq");
    if(node == NULL){
        printk("获取设备树节点失败\n");
        return -ENODATA;
    }
    //2.解析得到软中断号
    irqno = irq_of_parse_and_map(node, 0);
    if(irqno == 0){
        printk("解析失败\n");
        return -EAGAIN;
    }
    //3.注册中断
    ret = request_irq(irqno, key_irq, IRQF_TRIGGER_FALLING, "keyirq", NULL);
    if(ret == 0){
        printk("注册中断失败\n");
        return ret;
    }
    return 0;
}

static void __exit mycdev_exit(void)
{
    free_irq(irqno, NULL);
}

module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");